package com.example.redisson.redisson;

import jakarta.annotation.Resource;
import org.redisson.api.RBucket;
import org.redisson.api.RTransaction;
import org.redisson.api.RedissonClient;
import org.redisson.api.TransactionOptions;
import org.springframework.stereotype.Service;

@Service
public class TransactionalService {

    @Resource
    private RedissonClient redissonClient;

    /*
    * 分布式事务，适用于需要在单个 Redis 实例上保证数据一致性的场景。
    * 参考 https://www.bookstack.cn/read/redisson-wiki-zh/spilt.4.10.-%E9%A2%9D%E5%A4%96%E5%8A%9F%E8%83%BD.md
    * 如果你想要在多个服务之间协调事务，可能需要考虑其他的分布式事务解决方案，如 Seata、TCC、Saga 等
    */
    public void transactional() {
        // 创建并开启事务，事务选项使用默认配置，例如 事务超时时间 = 5000ms，重试尝试次数 = 3，重试间隔 = 1500ms
        RTransaction transactional = redissonClient.createTransaction(TransactionOptions.defaults());
        // 下面的代码将在事务中执行，直到事务被提交或回滚
        // 以下代码模拟了一个减库存和更新订单状态的操作

        // 获取 Bucket 对象
        RBucket<Integer> stockBucket = transactional.getBucket("stock");

        // 检查库存
        Integer currentStock = stockBucket.get();
        if (currentStock != null && currentStock > 0) {
            // 减少库存
            stockBucket.set(currentStock - 1);

            // 更新订单状态
            RBucket<String> orderStatusBucket = transactional.getBucket("order_status");
            orderStatusBucket.set("processing");
        } else {
            // 库存不足，取消事务
            transactional.rollback();
            System.out.println("Transaction rolled back due to insufficient stock.");
        }

        // 提交事务
        transactional.commit();
    }

}

// Redisson 提供了对 Redis 事务的支持，使得开发者能够在分布式环境中使用 Redis 的事务功能。Redis 的事务允许一系列命令作为一个整体执行，
// 即要么全部成功，要么全部失败。这对于需要保证一组操作的原子性的场景特别有用。
/*
主要用途：
    保证原子性:
        保证一系列操作作为一个整体执行，要么全部成功，要么全部失败。
        例如，更新库存和订单状态。
    并发控制:
        控制并发执行的事务数量，避免并发事务之间的数据竞争。
        例如，确保在高并发环境下数据的一致性。
    错误处理:
        在事务失败时，可以更方便地进行错误处理和回滚操作。
        例如，事务执行过程中出现网络异常，可以进行重试。
*/
// Redisson 的分布式事务功能使得开发者能够在分布式环境中使用 Redis 的事务能力。这有助于保证一组操作的原子性，避免数据不一致的问题。
// 通过使用 Redisson 的事务功能，你可以更方便地管理并发操作，确保数据的完整性和一致性。